public class Test {
    public static void main(String[] args) throws Exception {
        // 客户端随意选算法
        PayContext ctx = new PayContext(new WeChatPay());
        ctx.checkout(99.9);

        ctx.setStrategy(new UnionPay());
        ctx.checkout(12.5);
    }
}
// 定义一系列的算法，把它们一个个封装起来，并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
// 策略模式：Strategy，是指，定义一组算法，并把其封装到一个对象中。然后在运行时，可以灵活的使用其中的一个算法

/* ---------- 策略接口 ---------- */
interface PayStrategy {
    void pay(double amount);
}

/* ---------- 具体算法 ---------- */
class WeChatPay implements PayStrategy {
    public void pay(double amount) {
        System.out.println("微信支付 ￥" + amount);
    }
}

class UnionPay implements PayStrategy {
    public void pay(double amount) {
        System.out.println("银联支付 ￥" + amount);
    }
}

/* ---------- 上下文（客户） ---------- */
class PayContext {
    private PayStrategy strategy;

    PayContext(PayStrategy strategy) {
        this.strategy = strategy;
    }

    void setStrategy(PayStrategy strategy) {
        this.strategy = strategy;
    }

    void checkout(double amount) {
        strategy.pay(amount); // 运行时才决定用哪个算法
    }
}